import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import queue
import signal
import threading
import time
from flask import Flask, render_template, request

from Base.BaseSettings import ServerPort
from Common.utils import com_utils
from Common.utils.com_utils import exec_airtest_suite, R, delete_file, AirTaskData

app = Flask(__name__)
# 设置一个标志来指示是否要停止线程
should_stop_thread = False  # 标志来控制线程是否停止
# 任务队列
data_queue = queue.Queue()
# 线程的锁
lock = threading.Lock()


def consumer():
    while not should_stop_thread:
        if not data_queue.empty():
            with lock:  # 使用锁来确保同一时间只有一个线程处理数据
                data = data_queue.get()
                print(f"apk_url data '{data}'...")
                # 下载SDK审核平台的安装包
                try:
                    file_name, package_name = com_utils.download(data.get('apk_url'))
                except Exception as e:
                    print("下载地址错误: ", e)
                    continue
                print("package_name：", package_name)
                # 更新测试数据驱动信息（下载后的路径，下载后的包名）
                AirTaskData["package_path"] = file_name
                AirTaskData["package_name"] = package_name

                # 执行自动化测试
                report_url, pass_rate = exec_airtest_suite()

                # 执行完成后，删除本地的安装包文件
                delete_file(file_name)
                # tudo: 测试完成，发送报告信息到审核平台
                time.sleep(1)

                print(rf"启动 Entrance 文件夹下的 run.py 可访问：{report_url}")
                print(f"通过率：{pass_rate}")

        else:
            time.sleep(5)  # 如果队列为空，等待一段时间再检查


def signal_handler(sig, frame):
    global should_stop_thread
    should_stop_thread = True
    # 获取当前进程的 PID
    current_pid = os.getpid()
    # 发送 SIGINT 信号，模拟 Ctrl+C
    os.kill(current_pid, signal.SIGINT)


# 设置路由，当用户访问根路径时，触发404错误
@app.route('/')
def index():
    return render_template('404.html'), 404


@app.route('/airtest/add_task', methods=['POST'])
def add_task():
    """
    请求参数：
    1、SDK审核平台单子ID
    2、包体的下载地址
    """
    # data = request.json  # 假设接收到的数据是 JSON 格式
    project_id = request.form.get("project_id")  # 提审单ID
    package_id = request.form.get("package_id")  # 小单ID
    apk_url = request.form.get("apk_url")  # 下载地址
    data_queue.put({
        "apk_url": apk_url,
        "package_id": package_id
    })
    return R("ok")


if __name__ == '__main__':
    # 启动消费者线程，处理队列中的数据
    consumer_thread = threading.Thread(target=consumer)
    consumer_thread.start()

    signal.signal(signal.SIGINT, signal_handler)  # 注册信号处理程序，捕获Ctrl+C信号
    signal.signal(signal.SIGTERM, signal_handler)  # 注册信号处理程序，捕获终止信号

    app.run(host='0.0.0.0', port=ServerPort, debug=True)
